/*
* Copyright (c) 206.2，华乘电气科技有限公司
* All rights reserved.
*
* 文件名称：logunit.cpp
*
* 初始版本：1.0
* 作者：
* 创建日期：2016年2月17日
* 摘要：该文件主要是实现日志单元模块
*
*/
#include "logunit.h"
quint32 LogUnit::m_uiMaxCount = MAX_LOG_COUNT_DEFAULT;//最大条目数
QString LogUnit::m_strFilePath = "log";//存储路径

/****************************************/
//构造函数
//输入参数:
//      unitName -- 单元名
/****************************************/
LogUnit::LogUnit( const QString& unitName )
{
    //初始化文件名
    m_strFileName = m_strFilePath + "/" + unitName + "log.ini";
    m_strBakFileName = m_strFilePath + "/" + unitName + "log_bak.ini";

    //初始化条目数目
    QFile fileLog;
    fileLog.setFileName(m_strFileName);
    m_usItems = 0;
    fileLog.open(QIODevice::ReadOnly);
    while( fileLog.readLine().count() ) m_usItems++;
    fileLog.close();

    //打开日志
    m_fileLog.setFileName(m_strFileName);
    if( !m_fileLog.isOpen() )
    {
        if( !m_fileLog.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text|QIODevice::Unbuffered) )
        {
            qWarning("LogUnit::LogUnit:open log file %s failed.",qPrintable(m_strFileName));
        }
    }
}

/****************************************/
//记录信息
//输入参数:
//      fmt -- 格式字符串
//      ap -- 可变参数
/****************************************/
void LogUnit::write( const char *fmt, va_list ap )
{
    if(fmt == NULL)
    {
        return;
    }
    QString strLog;
    strLog.vsprintf(fmt,ap);

    QByteArray baData = QByteArray::number(m_usItems++)+'.'+QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss").toLatin1()
                        +' '+strLog.toLatin1()+"\n";

    m_fileLog.write(baData);
    m_fileLog.flush();
    if( m_usItems>=m_uiMaxCount )
    {
        QFile::remove(m_strBakFileName);
        if(  m_fileLog.copy(m_strBakFileName) )
        {
            if( m_fileLog.remove() )
            {
                m_usItems = 0;
                m_fileLog.close();
                m_fileLog.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text|QIODevice::Unbuffered);
            }
        }
    }

    #ifdef LOG_INFO_OUT
        qWarning( strLog.toLatin1().data()  );
    #endif
}

/****************************************/
//记录信息
//输入参数:
//      string -- 格式字符串
/****************************************/
void LogUnit::write( const QString& string )
{
    QString strLog = string;

    QByteArray baData = QByteArray::number(m_usItems++)+'.'+QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss").toLatin1()
                        +' '+strLog.toUtf8()+"\n";

    m_fileLog.write(baData);
    m_fileLog.flush();
    if( m_usItems>=m_uiMaxCount )
    {
        QFile::remove(m_strBakFileName);
        if(  m_fileLog.copy(m_strBakFileName) )
        {
            if( m_fileLog.remove() )
            {
                m_usItems = 0;
                m_fileLog.close();
                m_fileLog.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text|QIODevice::Unbuffered);
            }
        }
    }

    #ifdef LOG_INFO_OUT
        qWarning( strLog.toUtf8().data()  );
    #endif
}

/****************************************/
//设置路径
//输入参数:
//      path -- 路径
/****************************************/
void LogUnit::setPath( const QString& path )
{
    m_strFilePath = path;
    QDir thisDir;
    if( !thisDir.exists(m_strFilePath) )
    {
        if( !thisDir.mkpath(m_strFilePath) )
        {
            qWarning("LogUnit::initLogFiles:make dir %s failed.",qPrintable(m_strFilePath));
        }
    }
}

/****************************************/
//设置最大条目数
//输入参数:
//      uiMaxCount -- 最大条目数
/****************************************/
void LogUnit::setMaxCount( quint32 uiMaxCount )
{
    m_uiMaxCount = uiMaxCount;
}
